package com.hedl.practice.diyJava.regexs.study_search_and_replace.practice;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Template {
    private final String template;
    private final Pattern pattern = Pattern.compile("\\$\\{(\\w+)}");

    public Template(String template) {
        this.template = template;
    }

    public String render(Map<String, Object> data) {
        Matcher matcher = pattern.matcher(template);
        StringBuilder sb = new StringBuilder();
        while (matcher.find()) {        //find()方法用于在输入字符串中查找下一个匹配项。
            Object result = data.get(matcher.group(1));
            if (result != null) {
                // 追加替换
                // 1. 从输入序列中读取字符，从追加位置到匹配位置的开头，并将它们追加到给定的字符串生成器
                // 2. 将给定的替换字符串追加到字符串生成器
                // 3. 将此匹配器的追加位置设置为匹配字符串的结尾再加一
                //方法用于将当前匹配替换为data对象中相应密钥的值。
                // 它以StringBuffer对象和替换字符串为参数，用替换字符串替换当前匹配，并将最后一个匹配和当前匹配之间的文本附加到StringBuffer对象中
                matcher.appendReplacement(sb, result.toString());
            }
        }
        matcher.appendTail(sb);     //appendTail()方法将最后一个匹配后的剩余文本附加到StringBuffer对象。
        return sb.toString();       //在StringBuffer对象上调用toString()方法，以获取搜索和替换操作的最终结果。
    }

    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>();
        map.put("name","Bob");
        map.put("lang","Java");
        Template template1 = new Template("Hello, ${name}! You are learning ${lang}!");
        System.out.println(template1.render(map));
    }
}
